using System.Collections.Generic;
using System.Globalization;

using Hang.Blog.Localization;
using Hang.Blog.Web;
using Hang.Blog.Web.Menus;

using Localization.Resources.AbpUi;

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.Extensions.DependencyInjection;

using Volo.Abp.AspNetCore.TestBase;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.UI.Navigation;
using Volo.Abp.Validation.Localization;

namespace Hang.Blog {
    [DependsOn(
        typeof(AbpAspNetCoreTestBaseModule),
        typeof(BlogWebModule),
        typeof(BlogApplicationTestModule)
    )]
    public class BlogWebTestModule : AbpModule {
        public override void PreConfigureServices(ServiceConfigurationContext context) {
            context.Services.PreConfigure<IMvcBuilder>(builder => {
                builder.PartManager.ApplicationParts.Add(new AssemblyPart(typeof(BlogWebModule).Assembly));
            });
        }

        public override void ConfigureServices(ServiceConfigurationContext context) {
            ConfigureLocalizationServices(context.Services);
            ConfigureNavigationServices(context.Services);
        }

        private static void ConfigureLocalizationServices(IServiceCollection services) {
            var cultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("tr") };
            services.Configure<RequestLocalizationOptions>(options => {
                options.DefaultRequestCulture = new RequestCulture("en");
                options.SupportedCultures = cultures;
                options.SupportedUICultures = cultures;
            });

            services.Configure<AbpLocalizationOptions>(options => {
                options.Resources
                    .Get<BlogResource>()
                    .AddBaseTypes(
                        typeof(AbpValidationResource),
                        typeof(AbpUiResource)
                    );
            });
        }

        private static void ConfigureNavigationServices(IServiceCollection services) {
            services.Configure<AbpNavigationOptions>(options => {
                options.MenuContributors.Add(new BlogMenuContributor());
            });
        }
    }
}
